package com.bnz.dao.proxy;

import com.bnz.dao.UserDao;
import com.bnz.dao.impl.UserDaoImpl;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.invoke.MethodHandleInfo;
import java.lang.reflect.Method;


//CGLIB实现的动态代理模式（目标对象必须可以继承）
public class UserDaoCglibDynaProxyImpl implements MethodInterceptor {

    //创建代理对象
    public UserDao creatProxyObject(){
        //定义E对象
        Enhancer enhancer=new Enhancer();
        //定义E的父类
        enhancer.setSuperclass(UserDaoImpl.class);
        //设置代理对象的回调
        enhancer.setCallback(this);

        //创建代理对象
        Object o=enhancer.create();
        //返回
        return (UserDao) o;
    }



    //当我们调用目标方法时，此方法也会自动调用，相当于jdk动态代理的invoke方法
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {

        if(method.getName().equals("query")){
            checkSecurity();
        }

        //调用目标方法
        return methodProxy.invokeSuper(o,args);
    }
    public void checkSecurity(){
        System.out.println("【CGLIB动态代理】安全性检查。。。。。");
    }
}
